#pragma once

#include "OMIT_MeshVertex.h"
#include "OMIT_MeshEdge.h"
#include "OMIT_MeshFace.h"
#include "OMIT_MeshHalfEdge.h"

namespace OMIT_NAMESPACE
{
	template <typename TE, typename TF, typename TH> using MeshTraits_DefaultV = MeshTraits<DefaultV<TE, TF, TH>, TE, TF, TH>;
	template <typename TV, typename TF, typename TH> using MeshTraits_DefaultE = MeshTraits<TV, DefaultE<TV, TF, TH>, TF, TH>;
	template <typename TV, typename TE, typename TH> using MeshTraits_DefaultF = MeshTraits<TV, TE, DefaultF<TV, TE, TH>, TH>;
	template <typename TV, typename TE, typename TF> using MeshTraits_DefaultH = MeshTraits<TV, TE, TF, DefaultH<TV, TE, TF>>;

	template <typename TF, typename TH> using MeshTraits_DefaultVE = MeshTraits<DefaultVE_V<TF, TH>, DefaultVE_E<TF, TH>, TF, TH>;
	template <typename TE, typename TH> using MeshTraits_DefaultVF = MeshTraits<DefaultVF_V<TE, TH>, TE, DefaultVF_F<TE, TH>, TH>;
	template <typename TE, typename TF> using MeshTraits_DefaultVH = MeshTraits<DefaultVH_V<TE, TF>, TE, TF, DefaultVH_H<TE, TF>>;
	template <typename TV, typename TH> using MeshTraits_DefaultEF = MeshTraits<TV, DefaultEF_E<TV, TH>, DefaultEF_F<TV, TH>, TH>;
	template <typename TV, typename TF> using MeshTraits_DefaultEH = MeshTraits<TV, DefaultEH_E<TV, TF>, TF, DefaultEH_H<TV, TF>>;
	template <typename TV, typename TE> using MeshTraits_DefaultFH = MeshTraits<TV, TE, DefaultFH_F<TV, TE>, DefaultFH_H<TV, TE>>;

	template <typename TH> using MeshTraits_DefaultVEF = MeshTraits<DefaultVEF_V<TH>, DefaultVEF_E<TH>, DefaultVEF_F<TH>, TH>;
	template <typename TF> using MeshTraits_DefaultVEH = MeshTraits<DefaultVEH_V<TF>, DefaultVEH_E<TF>, TF, DefaultVEH_H<TF>>;
	template <typename TE> using MeshTraits_DefaultVFH = MeshTraits<DefaultVFH_V<TE>, TE, DefaultVFH_F<TE>, DefaultVFH_F<TE>>;
	template <typename TV> using MeshTraits_DefaultEFH = MeshTraits<TV, DefaultEFH_E<TV>, DefaultEFH_F<TV>, DefaultEFH_H<TV>>;

	using MeshTraits_DefaultVEFH = MeshTraits<DefaultVEFH_V, DefaultVEFH_E, DefaultVEFH_F, DefaultVEFH_H>;

	template <typename TE, typename TF, typename TH> class DefaultV : public TVert  <MeshTraits_DefaultV<TE, TF, TH>> {};
	template <typename TV, typename TF, typename TH> class DefaultE : public TEdge  <MeshTraits_DefaultE<TV, TF, TH>> {};
	template <typename TV, typename TE, typename TH> class DefaultF : public TFace  <MeshTraits_DefaultF<TV, TE, TH>> {};
	template <typename TV, typename TE, typename TF> class DefaultH : public TMesh_H<MeshTraits_DefaultH<TV, TE, TF>> {};

	template <typename TF, typename TH> class DefaultVE_V : public TVert  <MeshTraits_DefaultVE<TF, TH>> {};
	template <typename TF, typename TH> class DefaultVE_E : public TEdge  <MeshTraits_DefaultVE<TF, TH>> {};
	template <typename TE, typename TH> class DefaultVF_V : public TVert  <MeshTraits_DefaultVF<TE, TH>> {};
	template <typename TE, typename TH> class DefaultVF_F : public TFace  <MeshTraits_DefaultVF<TE, TH>> {};
	template <typename TE, typename TF> class DefaultVH_V : public TVert  <MeshTraits_DefaultVH<TE, TF>> {};
	template <typename TE, typename TF> class DefaultVH_F : public TMesh_H<MeshTraits_DefaultVH<TE, TF>> {};
	template <typename TV, typename TH> class DefaultEF_E : public TEdge  <MeshTraits_DefaultEF<TV, TH>> {};
	template <typename TV, typename TH> class DefaultEF_F : public TFace  <MeshTraits_DefaultEF<TV, TH>> {};
	template <typename TV, typename TF> class DefaultEH_E : public TEdge  <MeshTraits_DefaultEH<TV, TF>> {};
	template <typename TV, typename TF> class DefaultEH_H : public TMesh_H<MeshTraits_DefaultEH<TV, TF>> {};
	template <typename TV, typename TE> class DefaultFH_F : public TFace  <MeshTraits_DefaultFH<TV, TE>> {};
	template <typename TV, typename TE> class DefaultFH_H : public TMesh_H<MeshTraits_DefaultFH<TV, TE>> {};

	template <typename TH> class DefaultVEF_V : public TVert  <MeshTraits_DefaultVEF<TH>> {};
	template <typename TH> class DefaultVEF_E : public TEdge  <MeshTraits_DefaultVEF<TH>> {};
	template <typename TH> class DefaultVEF_F : public TFace  <MeshTraits_DefaultVEF<TH>> {};
	template <typename TF> class DefaultVEH_V : public TVert  <MeshTraits_DefaultVEH<TF>> {};
	template <typename TF> class DefaultVEH_E : public TEdge  <MeshTraits_DefaultVEH<TF>> {};
	template <typename TF> class DefaultVEH_H : public TMesh_H<MeshTraits_DefaultVEH<TF>> {};
	template <typename TE> class DefaultVFH_V : public TVert  <MeshTraits_DefaultVFH<TE>> {};
	template <typename TE> class DefaultVFH_F : public TFace  <MeshTraits_DefaultVFH<TE>> {};
	template <typename TE> class DefaultVFH_H : public TMesh_H<MeshTraits_DefaultVFH<TE>> {};
	template <typename TV> class DefaultEFH_E : public TEdge  <MeshTraits_DefaultEFH<TV>> {};
	template <typename TV> class DefaultEFH_F : public TFace  <MeshTraits_DefaultEFH<TV>> {};
	template <typename TV> class DefaultEFH_H : public TMesh_H<MeshTraits_DefaultEFH<TV>> {};

	class DefaultVEFH_V : public TVert  <MeshTraits_DefaultVEFH> {};
	class DefaultVEFH_E : public TEdge  <MeshTraits_DefaultVEFH> {};
	class DefaultVEFH_F : public TFace  <MeshTraits_DefaultVEFH> {};
	class DefaultVEFH_H : public TMesh_H<MeshTraits_DefaultVEFH> {};
}
